package uy.edu.ort.persistencia.dao;

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import uy.edu.ort.dominio.Programa;
import uy.edu.ort.persistencia.util.HibernateUtil;

/**
 *
 * @author 153287-154559
 */
public class ProgramaDAO {

    private Session sesion;
    private Transaction tx;

    public long guardaPrograma(Programa programa) throws HibernateException {
        long id = 0;

        try {
            iniciaOperacion();
            id = (Long) sesion.save(programa);
            tx.commit();
        } catch (HibernateException he) {
            handleException(he);
            throw he;
        } finally {
            sesion.close();
        }

        return id;
    }

    public List<Programa> obtenerListaProgramas() throws HibernateException {
        List<Programa> listaProgramas = null;

        try {
            iniciaOperacion();
            listaProgramas = sesion.getNamedQuery("Programa.findAll").list();
        } finally {
            sesion.close();
        }

        return listaProgramas;
    }

    public List<Programa> obtenerProgramaByNombre(String nombre) throws HibernateException {
        List<Programa> listaProgramas = null;

        try {
            iniciaOperacion();
            listaProgramas = sesion.getNamedQuery("Programa.findByNombre").setString("NOMBRE", nombre).list();
        } finally {
            sesion.close();
        }

        return listaProgramas;
    }

    public List<Programa> obtenerListaProgramasPorCliente(String idCliente) throws HibernateException {
        List<Programa> listaProgramas = null;
        try {
            iniciaOperacion();
            Criteria c = sesion.createCriteria(Programa.class);
            c.add(Restrictions.eq("cliente.identificador", idCliente));
            listaProgramas = c.list();
        } finally {
            sesion.close();
        }

        return listaProgramas;
    }

    public List<Programa> obtenerListaProgramasPorTamaño() throws HibernateException {
        List<Programa> listaProgramas = null;

        try {
            iniciaOperacion();
            Criteria c = sesion.createCriteria(Programa.class);
            c.addOrder(Order.desc("tamaño"));
            c.setMaxResults(10);
            listaProgramas = c.list();
        } finally {
            sesion.close();
        }

        return listaProgramas;
    }

    public List<Programa> obtenerListaProgramasPorPaginas() throws HibernateException {
        List<Programa> listaProgramas = null;

        try {
            iniciaOperacion();
            Criteria c = sesion.createCriteria(Programa.class);
            c.addOrder(Order.desc("cantidadPaginas"));
            c.setMaxResults(10);
            listaProgramas = c.list();
        } finally {
            sesion.close();
        }

        return listaProgramas;
    }

    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    private void handleException(HibernateException he) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Ocurrió un error en la capa de acceso a datos", he);
    }
}
